\documentclass[hyperref,UTF8]{ctexart}
\usepackage{hyperref}

\usepackage{fancyhdr}
\pagestyle{fancy}
\usepackage{enumerate}
\usepackage{geometry}
\geometry{a4paper,scale=0.72}
\setlength\headwidth{\textwidth}

\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{newtxmath}
\usepackage{mathtools}
\ctexset{section={format={\Large\bfseries}}}

\title{数值分析项目作业}

\author{邵盛栋 \\ 信息与计算科学 3200103951}

\begin{document}
	\maketitle
	\section*{编译说明}
	在\verb*|src|和\verb*|report|文件夹中分别输入make产生可执行文件\verb*|A|,\verb*|CD|和\verb*|E|以及实验报告\verb*|report.pdf|，再执行\verb|./run|可得到输出结果，将输出结果放入matlab文件中运行即可得到报告所示图片.
	\section*{程序设计思路}
	\subsection*{头文件Spline.h}
	该头文件可以实现B-样条和ppform两种插值算法。
	
	其中 BsplineInterpolation类与ppFormInterpolation类基于Interpolation类而展开，两种插值算法均能够实现分段线性样条插值和$ S_{3}^{2} $样条插值，针对$ S_{3}^{2} $支持complete cubic spline,cubic spline with specified second derivatives at its end points和natural cubic spline三种边界条件。BsplineInterpolation类和ppFormInterpolation类中分别有operator()和solve()等函数，用以实现函数值的计算以及插值函数的生成。
	\subsection*{头文件function.h}
	该头文件可以实现一般函数、多项式函数、B-样条函数等函数的储存。
	
	其中包含了基本的Function类，多项式函数Polynomial类，离散函数Discrete类以及B-样条函数Bsplines类，每类中分别定义operator()或者diff1(),diff2()等函数，用以实现基本的函数计算。
	\section*{实验报告}
	\begin{enumerate}[A]
		\item 给定函数$ f(x)=\dfrac{1}{1+25x^{2}} $,输入区间左端点-1和右端点1，取N分别为6，11，21，41，81，condition取值为1，2，3分别表示三种边界条件，order取1和3分别表示线性样条和三次样条.
		
		本题中我以$ condition=1 $为例，首先使用三次样条B-样条插值算法，得到N不同时的插值结果：
		\begin{figure}[ht]
			\centering
			\includegraphics[width=0.65\linewidth]{questionA1}
		\end{figure}
		
		之后再使用ppForm插值算法，得到N不同时的插值结果：
		\begin{figure}[ht]
			\centering
			\includegraphics[width=0.65\linewidth]{questionA2}
		\end{figure}
		
		最后使用线性样条B-样条插值算法，得到N不同时的插值结果：
		\newpage
		\begin{figure}[ht]
			\centering
			\includegraphics[width=0.65\linewidth]{questionA3}
		\end{figure}
		
		误差情况如下表所示：
		\begin{itemize}
			\item 三次样条，B-样条插值方法\\
			\begin{tabular}{|c|c|c|c|c|c|}
				\hline
				N& 6 & 11 & 21 & 41 & 81 \\
				\hline
				error& 0.421705 & 0.0205289 & 0.00316894 & 0.000275356 & 1.609e-05 \\
				\hline
			\end{tabular}
			\item 三次样条，ppForm插值方法\\
			\begin{tabular}{|c|c|c|c|c|c|}
				\hline
				N& 6 & 11 & 21 & 41 & 81 \\
				\hline
				error& 0.421705 & 0.0205289 & 0.00316894 & 0.000275356 & 1.609e-05 \\
				\hline
			\end{tabular}
			\item 线性样条，B-样条插值方法\\
			\begin{tabular}{|c|c|c|c|c|c|}
				\hline
				N& 6 & 11 & 21 & 41 & 81 \\
				\hline
				error& 0.5 & 0.05 & 0.0411765 & 0.0140271 & 0.00380126 \\
				\hline
			\end{tabular}
		\end{itemize}
		\item 本题在头文件中已实现。
		\item 与D题结合
		\item 给定函数$ f(x)=\dfrac{1}{1+x^{2}} $，输入三次B-样条插值点与线性B-样条插值点，output为$ E_{S}(x) $需要输出值的点.\\
		运行结果如下：
		\begin{figure}[ht]
			\centering
			\includegraphics[width=0.3\linewidth]{questionCD1}
		\end{figure}
		
		由结果可知，三次样条插值所得结果比线性样条插值更为精确.
		
		绘制误差函数$ E_{S}(x) $图像如下:
		\begin{figure}[ht]
			\centering
			\includegraphics[width=0.7\linewidth]{questionCD2}
		\end{figure}
	
		由图像可知三次样条产生的误差要远小于线性插值产生的误差，最后将
		\[ x=-3.5,-3,-0.5,0,0.5,3,3.5 \]
		时误差函数的值输出：
		\begin{verbatim*}
			三次样条误差:
			0.000669568,0,0.0205289,0,0.0205289,0,0.000669568
			线性样条误差:
			0,0.00670137,0,0.2,0,0.00670137,0
		\end{verbatim*}
		有些误差接近机器精度，因为在这些点的插值函数值正好非常接近原函数的值，误差非常小，两个B-样条中三次样条更准确.
		\item 本题需要绘制一个闭合曲线
		\[ x^{2}+(\dfrac{3}{2}y-\sqrt{|x|})^{2}=3 \]
		输入插值点个数10，40，160，使用更为准确的三次自然B-样条插值算法，即取$ condition=3,order=3 $来进行拟合，将输出结果放入matlab程序进行绘图得到：
		\newpage
		\begin{figure}[ht]
			\centering
			\includegraphics[width=0.4\linewidth]{questionE1}
		\end{figure}
		\begin{figure}[ht]
			\centering
			\includegraphics[width=0.4\linewidth]{questionE2}
		\end{figure}
		\begin{figure}[ht]
			\centering
			\includegraphics[width=0.4\linewidth]{questionE3}
		\end{figure}

由图可知，随着N的增大，拟合效果越来越好，与心形越来越接近，这也说明了选择三次自然B-样条插值的合理性。
	\end{enumerate}


\end{document}
